home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 147 / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan).7z / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan) (Track 1).bin / docs / ippon / data / expl / expl.c < prev    next >
C/C++ Source or Header  |  2000-05-12  |  6KB  |  281 lines

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <XSP2lib.H>
  5. #include <pcm8afnc.h>
  6. #include <sys/dos.h>
  7. #include <sys/iocs.h>
  8. #include "expl.h"
  9. #include "fxsp2lib.h"
  10.  
  11.  
  12. #define    PCG_MAX    1024        /* スプライトPCGパターン最大使用数 */
  13. #define    REF_MAX    1024        /* 複合スプライトリファレンスデータ最大使用数 */
  14. #define    FRM_MAX    1024        /* 複合スプライトフレームデータ最大使用数 */
  15. #define RGB(r,g,b) ((g)<<11|(r)<<6|(b)<<1)
  16.  
  17. static char pcg_alt[PCG_MAX + 1];    /* PCG配置管理テーブル */
  18. static char pcg_dat[PCG_MAX * 128];    /* PCGデータファイル読み込みバッファ */
  19. static XOBJ_FRM_DAT frm_dat[FRM_MAX];    /* フレームデータ */
  20. static XOBJ_REF_DAT ref_dat[REF_MAX];    /* リファレンスデータ */
  21. static int old_crtmod;
  22.  
  23. extern int bomb_init0 (void);
  24. extern void bomb_move (void);
  25. extern void bomb_tini (void);
  26.  
  27. extern int seq_init0 (void);
  28. extern void seq_init (void);
  29. extern void seq_move (void);
  30. extern void seq_tini (void);
  31.  
  32. extern unsigned char seq_counter;
  33. int s_option = 0;
  34. unsigned char n_option = 0;
  35.  
  36.  
  37. void usage (void)
  38. {
  39.     printf ("爆発パターン表示&作成 expl.x ver0.02\n"
  40.         "        programmed by Mitsuky <FreeSoftware>\n"
  41.         "[option]\n"
  42.         "    -S数値 : 乱数のシードを指定\n"
  43.         "    -N : .obj ファイルを生成しない\n"
  44.     );
  45. }
  46.  
  47. /* 起動時のファイル読み込み */
  48. /* 読み込みに失敗した場合はいきなり終了するので注意 */
  49. int load_file (char *fname, void *ptr, size_t size, size_t n)
  50. {
  51.     FILE *fp;
  52.     int i;
  53.  
  54.     if ((fp = fopen (fname, "rb")) == NULL) {
  55.         //fatal_error (ERROR_FILE, fname);
  56.     }
  57.     i = fread (ptr, size, n, fp);
  58.     fclose (fp);
  59.  
  60.     return (i);        /* 返り値は読み込みバイト数 */
  61. }
  62.  
  63.  
  64. void wait_vdisp (void)
  65. {
  66.     int sp;
  67.     sp = _iocs_b_super (0);
  68.     while ((*(volatile unsigned char *) 0xe88001) & 0x10 == 0);
  69.     while ((*(volatile unsigned char *) 0xe88001) & 0x10);
  70.     _iocs_b_super (sp);
  71. }
  72.  
  73.  
  74.  
  75. void init (void)
  76. {
  77.     int i, sp;
  78.     unsigned short *s, *d;
  79.     unsigned short pal_dat[16 * 15];    /* パレットデータファイル読み込みバッファ */
  80.     int sizeof_ref;        /* 複合スプライトリファレンスデータ読み込み数 */
  81.     unsigned short crtcdata[9] =
  82.     {69, 6, 11 + 8, 59 - 8, 567, 5, 40, 552, 785};
  83.     unsigned short textpalet[16] =
  84.     {0, RGB (16, 16, 20), RGB (12, 12, 20), RGB (28, 28, 31), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
  85.  
  86.     old_crtmod = _iocs_crtmod (-1);
  87.     _iocs_b_curoff ();
  88.     wait_vdisp ();
  89.     _iocs_crtmod (14);    /* 256*256dot 31kHz 65536色 */
  90.     _iocs_g_clr_on ();
  91.     _iocs_b_curoff ();
  92.     _iocs_ms_curof ();
  93.     _iocs_skey_mod (0, 0, 0);
  94.  
  95.     //sp = _iocs_b_super (0);
  96.     //*(unsigned short *) 0xe82600 &= 0xff80;    /* 画面表示全オフ */
  97.     //_iocs_b_super (sp);
  98.  
  99.  
  100.     _iocs_sp_init ();
  101.     _iocs_sp_on ();        /* スプライト表示をON */
  102.     _iocs_bgctrlst (0, 0, 0);    /* BG0表示OFF */
  103.     _iocs_bgctrlst (1, 1, 0);    /* BG1表示OFF */
  104.  
  105.  
  106.     /* 256x256 正方形モードを作る */
  107.     sp = _iocs_b_super (0);
  108.     *(unsigned short *) 0xe80028 = crtcdata[8];
  109.     d = (unsigned short *) 0xe80002;
  110.     for (i = 1; i < 8; i++)
  111.         *d++ = crtcdata[i];
  112.     *(unsigned short *) 0xe80000 = crtcdata[0];
  113.  
  114.     *(unsigned short *) 0xe8e006 |= 0b10;    /* HRL ビット */
  115.     *(unsigned short *) 0xeb080c = crtcdata[2] + 4;
  116.     *(unsigned short *) 0xeb080a = crtcdata[0];    /* スプライト */
  117.     *(unsigned short *) 0xeb080e = crtcdata[6];
  118.  
  119.     *(unsigned short *) 0xe82500 = 0b01001001001110;    /* 優先順位 TX>SP>GR */
  120.     _iocs_b_super (sp);
  121.  
  122.     load_file ("BOM.SP", pcg_dat, sizeof (char), 128 * PCG_MAX);
  123. #if    0
  124.     load_file ("obj.xsp", pcg_dat + 256 * 128, sizeof (char), 128 * PCG_MAX);
  125.     load_file ("obj.frm", frm_dat, sizeof (XOBJ_FRM_DAT), FRM_MAX);
  126.     sizeof_ref = load_file ("obj.ref", ref_dat, sizeof (XOBJ_REF_DAT), REF_MAX);
  127. #endif
  128.     load_file ("BOM01.PAL", pal_dat, 2, 16);
  129.  
  130. #if    0
  131.     /* FRM_DAT[].pt 補正 */
  132.     for (i = 0; i < 256; i++)
  133.         (short) frm_dat[i].pt += 256;
  134.  
  135.     /* REF_DAT[].ptr 補正 */
  136.     for (i = 0; i < sizeof_ref; i++)
  137.         (int) ref_dat[i].ptr += (int) (&frm_dat[0]);
  138. #endif
  139.  
  140.     /* パレットに転送 */
  141.     sp = _iocs_b_super (0);
  142.     s = (unsigned short *) 0xe82200;
  143.     for (i = 0; i < 16; i++)
  144.         *s++ = textpalet[i];
  145.     d = pal_dat;
  146.     for (i = 0; i < 15 * 16; i++)
  147.         *s++ = *d++;
  148.     _iocs_b_super (sp);
  149.  
  150.     {
  151.         struct _lineptr lp;
  152.         lp.x1 = 0;
  153.         lp.y1 = 128;
  154.         lp.x2 = 255;
  155.         lp.y2 = 128;
  156.         lp.color = 0xf800;
  157.         lp.linestyle = 0xaaaa;
  158.         _iocs_line (&lp);
  159.         lp.x1 = 128;
  160.         lp.y1 = 0;
  161.         lp.x2 = 128;
  162.         lp.y2 = 255;
  163.         _iocs_line (&lp);
  164.     }
  165.  
  166.     seq_init0 ();
  167.     bomb_init0 ();
  168. #if    0
  169.     enemy_init0 ();
  170. #endif
  171.     _dos_breakck (2);    /* BREAK チェックを殺す */
  172.  
  173.     xsp_on ();
  174.     fxsp_on ();
  175.     xsp_mode (2);
  176.     xsp_pcgdat_set (pcg_dat, pcg_alt, sizeof (pcg_alt));
  177.     xsp_objdat_set (ref_dat);
  178.     pcm8a_vsyncint_on ();
  179.  
  180.     //sp = _iocs_b_super (0);
  181.     //*(unsigned short *) 0xe82600 |= 0x007f;    /* 画面表示オン */
  182.     //_iocs_b_super (sp);
  183. }
  184.  
  185.  
  186. int tini (void)
  187. {
  188.     int sp;
  189.  
  190.     pcm8a_vsyncint_off ();
  191.     xsp_off ();
  192.     fxsp_off ();
  193.  
  194.     bomb_tini ();
  195.     wait_vdisp ();
  196.  
  197.     sp = _iocs_b_super (0);
  198.     *(unsigned short *) 0xe8e006 &= 0xfffd;    /* HRL ビット */
  199.     _iocs_b_super (sp);
  200.  
  201.     _iocs_skey_mod (-1, 0, 0);
  202.     _iocs_b_curon ();
  203.     _iocs_crtmod (old_crtmod);
  204.  
  205.     return (0);
  206. }
  207.  
  208.  
  209.  
  210. void game (void)
  211. {
  212.     seq_init ();
  213.  
  214. //    do {
  215.         for (;;) {
  216.             //xsp_vsync (20);
  217.             seq_move ();
  218.             bomb_move ();
  219.             fxsp_out ();
  220.             if (!xsp_out ())
  221.                 break;
  222.         }
  223.         seq_counter = 0;
  224. //    } while ((_iocs_ms_getdt ()& 0xff00) == 0);
  225. }
  226.  
  227.  
  228.  
  229. int main (int argc, char *argv[])
  230. {
  231.     int i;
  232.     int slash_flag = 0;
  233.     int fname_found_flag = 0;    /* ファイル名が1つでもあったか */
  234.  
  235.     {
  236.         char *temp;
  237.  
  238.         temp = getenv ("SLASH");
  239.         if ((temp != NULL) && (*temp == '/')) {
  240.             slash_flag = 1;
  241.         }
  242.     }
  243.  
  244.     for (i = 1; i < argc; i++) {
  245.         if (('-' == *argv[i]) || ((slash_flag == 0) && ('/' == *argv[i]))) {
  246.             switch (*(argv[i] + 1)) {
  247.  
  248.             case 's':
  249.             case 'S':
  250.                 sscanf (argv[i] + 2, "%d", &s_option);
  251.                 break;
  252.  
  253.             case 'n':
  254.             case 'N':
  255.                 n_option = !0;
  256.                 break;
  257.  
  258.             default:
  259.                 usage ();
  260.                 return (-1);
  261.             }
  262.         } else {
  263.             fname_found_flag = 1;
  264.         }
  265.     }
  266.  
  267.     srand(s_option);
  268. #if    0
  269.     if (fname_found_flag == 0) {
  270.         usage ();
  271.         return (-1);
  272.     }
  273. #endif
  274.     init ();
  275.     game ();
  276.  
  277.     tini ();
  278.  
  279.     return (0);
  280. }
  281.